/*
 * Copyright 2025, AutoMQ HK Limited.
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.automq.stream.s3.metrics.stats;

import com.automq.stream.s3.metrics.MetricsLevel;
import com.automq.stream.s3.metrics.S3StreamMetricsConstant;
import com.automq.stream.s3.metrics.S3StreamMetricsManager;
import com.automq.stream.s3.metrics.operations.S3Operation;
import com.automq.stream.s3.metrics.wrapper.HistogramMetric;

public class StreamOperationStats {
    private static volatile StreamOperationStats instance = null;
    public final HistogramMetric createStreamLatency = S3StreamMetricsManager
            .buildOperationMetric(MetricsLevel.INFO, S3Operation.CREATE_STREAM.getType().getName(), S3Operation.CREATE_STREAM.getName());
    public final HistogramMetric openStreamLatency = S3StreamMetricsManager
            .buildOperationMetric(MetricsLevel.INFO, S3Operation.OPEN_STREAM.getType().getName(), S3Operation.OPEN_STREAM.getName());
    public final HistogramMetric appendStreamLatency = S3StreamMetricsManager
            .buildOperationMetric(MetricsLevel.INFO, S3Operation.APPEND_STREAM.getType().getName(), S3Operation.APPEND_STREAM.getName());
    public final HistogramMetric fetchStreamLatency = S3StreamMetricsManager
            .buildOperationMetric(MetricsLevel.INFO, S3Operation.FETCH_STREAM.getType().getName(), S3Operation.FETCH_STREAM.getName());
    public final HistogramMetric trimStreamLatency = S3StreamMetricsManager
            .buildOperationMetric(MetricsLevel.INFO, S3Operation.TRIM_STREAM.getType().getName(), S3Operation.TRIM_STREAM.getName());
    private final HistogramMetric closeStreamSuccessLatency = S3StreamMetricsManager
            .buildOperationMetric(MetricsLevel.INFO, S3Operation.CLOSE_STREAM.getType().getName(), S3Operation.CLOSE_STREAM.getName(), S3StreamMetricsConstant.LABEL_STATUS_SUCCESS);
    private final HistogramMetric closeStreamFailLatency = S3StreamMetricsManager
            .buildOperationMetric(MetricsLevel.INFO, S3Operation.CLOSE_STREAM.getType().getName(), S3Operation.CLOSE_STREAM.getName(), S3StreamMetricsConstant.LABEL_STATUS_FAILED);

    private StreamOperationStats() {
    }

    public static StreamOperationStats getInstance() {
        if (instance == null) {
            synchronized (StreamOperationStats.class) {
                if (instance == null) {
                    instance = new StreamOperationStats();
                }
            }
        }
        return instance;
    }

    public HistogramMetric closeStreamStats(boolean isSuccess) {
        return isSuccess ? closeStreamSuccessLatency : closeStreamFailLatency;
    }
}
